package unq.uis.robots.ui;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.bindings.NotNullObservable;
import org.uqbar.arena.layout.ColumnLayout;
import org.uqbar.arena.layout.HorizontalLayout;
import org.uqbar.arena.layout.VerticalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.Dialog;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.WindowOwner;
import org.uqbar.commons.model.UserException;


import unq.uis.robots.applicationsModels.ComprarRobotApplicationModel;
import unq.uis.robots.applicationsModels.JugadorVista;
import unq.uis.robots.applicationsModels.PelearApplicationModel;
import unq.uis.robots.applicationsModels.RobotVista;
import unq.uis.robots.applicationsModels.VenderRobotApplicationModel;
import unq.uis.robots.model.Robot;

public class UsuarioWindow extends SimpleWindow<JugadorVista>{

	private static final long serialVersionUID = 1L;
	
	public UsuarioWindow(WindowOwner parent, JugadorVista model) {
		super(parent, model);
	}

	protected void createMainTemplate(Panel mainPanel){
		this.setTitle("Pelea Sangrienta De Robots");
		super.createMainTemplate(mainPanel);	
	}
	
	@Override
	protected void createFormPanel(Panel mainPanel) {
		Panel panel = new Panel(mainPanel);
		panel.setLayout(new ColumnLayout(3));
		
		Label nombre = new Label(panel);
		nombre.setFontSize(50);
		nombre.bindValueToProperty("jugador.nombre");
		
		new Label(panel).setText("   $").setFontSize(50);

		Label dinero = new Label(panel);
		dinero.setFontSize(50);
		dinero.bindValueToProperty("jugador.dinero");	
		
		Panel panelVertical = new Panel(mainPanel);
		panelVertical.setLayout(new VerticalLayout());
		
		new Label(panel).setText("Mis Robots");
		this.crearBotonComprar(panel);		
		
		Panel panelHorizontalMisRobots = new Panel(panelVertical);
		this.createJugadorRobotGrill(panelHorizontalMisRobots);		
		
		Panel panelHorizontalOtrosRobots = new Panel(panelVertical);
		this.crearTablaDeOtrosRobots(panelHorizontalOtrosRobots);		
	}

	@Override
	protected void addActions(Panel actionsPanel) {		
	}
	
	public void crearBotonComprar(Panel panel) {
		this.createButton(panel, "Comprar", "comprar");
	}

	public Button createButton(Panel panel, String caption, String methodName) {
		Button button = new Button(panel);
		button.setCaption(caption);
		button.onClick(new MessageSend(this, methodName));
		return button;
	}
	
	public void comprar(){
		ComprarRobotApplicationModel comprarAM = new ComprarRobotApplicationModel(this.getModelObject());
		Dialog<ComprarRobotApplicationModel> dialog = new ComprarRobotWindow(this, comprarAM);
		dialog.onAccept(new MessageSend(comprarAM, "ofertar"));
		dialog.open();
	}
	
	public void crearBotonVender(Panel panel) {
		Button vender = this.createButton(panel, "Vender", "vender");	
		// Deshabilitar los botones si no hay ningún elemento seleccionado en la grilla.
		NotNullObservable elementSelected = new NotNullObservable(JugadorVista.ROBOTSELECCIONADO);		
		vender.bindEnabled(elementSelected);
	}
	
	public void vender(){
		VenderRobotApplicationModel venderAM = new VenderRobotApplicationModel(this.getModelObject(), this.getModelObject().getRobotSeleccionado());
		Dialog<VenderRobotApplicationModel> dialog = new VenderRobotWindow(this, venderAM);
		dialog.onAccept(new MessageSend(venderAM, "vender"));
		dialog.onCancel(new MessageSend(dialog, "notificarRechazoDeOferta"));
		dialog.open();
	}
	
	public void crearBotonCompetir(Panel panel) {
		Button competir = createButton(panel, "Competir", "competir");	
		
		NotNullObservable elementSelected = new NotNullObservable(JugadorVista.ROBOTSELECCIONADO);		
		competir.bindEnabled(elementSelected);
		NotNullObservable elementSelected2 = new NotNullObservable(JugadorVista.ROBOTCONTRINCANTESELECCIONADO);		
		competir.bindEnabled(elementSelected2);
	}
	
	public void competir() {
		this.getModelObject().validaSePuedeCompetir();
		PelearApplicationModel pelea = new PelearApplicationModel(this.getModelObject());
		new PelearWindow(this, pelea).open();
	}
	
	public void crearBotonMejorar(Panel panel) {
		createButton(panel, "Mejorar", "mejorarRobotSeleccionado") //
			.bindEnabled(new NotNullObservable(JugadorVista.ROBOTSELECCIONADO));
	}
	
	public void mejorarRobotSeleccionado(){		
		RobotVista robotVista = new RobotVista(this.getModelObject().getRobotSeleccionado());
		Dialog<RobotVista> dialog = new MejorarRobotWindow(this, robotVista);
		dialog.onAccept(new MessageSend(robotVista, "mejorarRobot"));
		dialog.open();
	}

	public void crearBotonReparar(Panel panel){
		this.createButton(panel, "Reparar", "repararRobotSeleccionado") //
			.bindEnabled(new NotNullObservable(JugadorVista.ROBOTSELECCIONADO));		
	}
	
	public void repararRobotSeleccionado(){
		if(this.getModelObject().getRobotSeleccionado().getDanio() == 0)
			throw new UserException("Este robot no se puede reparar porque no tiene daño");
		
		RobotVista robotVista = new RobotVista(this.getModelObject().getRobotSeleccionado());
		Dialog<RobotVista> dialog = new RepararRobotWindow(this, robotVista);		
		dialog.onAccept(new MessageSend(robotVista, "repararRobot"));
		dialog.open();
	}

	private void createJugadorRobotGrill(Panel mainPanel) {
		Panel panel = new Panel(mainPanel);
		panel.setLayout(new HorizontalLayout());
		
		Table<Robot> table = new Table<Robot>(panel, Robot.class);
		table.bindItemsToProperty(JugadorVista.ROBOTS);
		
		table.bindSelection(JugadorVista.ROBOTSELECCIONADO);
		
		Column<Robot> nombreColumn = new Column<Robot>(table);
		nombreColumn.setTitle("Nombre");
		nombreColumn.setFixedSize(100);
		nombreColumn.bindContentsToProperty(Robot.NOMBRE);

		Column<Robot> poderColumn = new Column<Robot>(table);
		poderColumn.setTitle("Poder total");
		poderColumn.setFixedSize(100);
		poderColumn.bindContentsToProperty(Robot.PODERTOTAL);

		Column<Robot> porcentajeColumn = new Column<Robot>(table);
		porcentajeColumn.setTitle("Nivel Deterioro");
		porcentajeColumn.setFixedSize(100);
		porcentajeColumn.bindContentsToProperty(Robot.DANIO);
		
		table.setWidth(400);
		table.setHeigth(150);		
		
		Panel panelDeBotones = new Panel(panel);
		panelDeBotones.setLayout(new VerticalLayout());		
		this.crearBotonReparar(panelDeBotones);	
		this.crearBotonMejorar(panelDeBotones);		
		this.crearBotonVender(panelDeBotones);
	}
	
	private void crearTablaDeOtrosRobots(Panel mainPanel) {
		
		Panel panelTitulo = new Panel(mainPanel);
		new Label(panelTitulo).setText("Otros Robots");
		
		Panel panel = new Panel(mainPanel);
		panel.setLayout(new HorizontalLayout());		
		
		Panel panelHorizontal = new Panel(panel);
		
		Table<Robot> table = new Table<Robot>(panelHorizontal, Robot.class);
		table.bindItemsToProperty(JugadorVista.OTROSROBOTS);
		
		table.bindSelection(JugadorVista.ROBOTCONTRINCANTESELECCIONADO);
		
		Column<Robot> nombreColumn = new Column<Robot>(table);
		nombreColumn.setTitle("Nombre");
		nombreColumn.setFixedSize(100);
		nombreColumn.bindContentsToProperty(Robot.NOMBRE);
		
		Column<Robot> duenioColumn = new Column<Robot>(table);
		duenioColumn.setTitle("Duenio");
		duenioColumn.setFixedSize(100);
		duenioColumn.bindContentsToProperty(Robot.DUENIO);		
		
		Column<Robot> poderColumn = new Column<Robot>(table);
		poderColumn.setTitle("Poder");
		poderColumn.setFixedSize(100);
		poderColumn.bindContentsToProperty(Robot.PODERTOTAL);

		Column<Robot> porcentajeColumn = new Column<Robot>(table);
		porcentajeColumn.setTitle("Nivel Deterioro");
		porcentajeColumn.setFixedSize(100);
		porcentajeColumn.bindContentsToProperty(Robot.DANIO);
		
		table.setWidth(400);
		table.setHeigth(175);
		
		this.crearBotonCompetir(panel);	
	}
	
}
